/**
 * 基于fetch封装的HTTP请求工具
 * @param {Object} config - 请求配置
 * @param {string} config.url - 请求路径
 * @param {'GET'|'POST'|'PATCH'|'DELETE'|'PUT'} config.method - 请求方法
 * @param {Object} [config.params] - 请求参数
 * @returns {Promise} 返回Promise对象
 */
import { message } from "ant-design-vue";
const HttpRequest = function ({ url, method, params = {} }) {
  const baseUrl = "http://localhost:8090/api";
  let fullUrl = baseUrl + url;
  const token = sessionStorage.getItem("token") || "";

  // 处理不同请求方法的参数
  let requestConfig = {
    method: method,
    headers: {
      "Content-Type": "application/json",
      Authorization: token,
    },
    timeout: 5000, // 注意：原生fetch没有timeout属性，需要额外处理
  };

  // 区分GET和其他方法的参数传递
  if (method === "GET") {
    // 将参数转换为查询字符串
    const queryString = Object.keys(params)
      .map(
        (key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
      )
      .join("&");
    if (queryString) {
      fullUrl += (fullUrl.includes("?") ? "&" : "?") + queryString;
    }
  } else {
    requestConfig.body = JSON.stringify(params);
  }

  // 实现超时控制
  const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => {
      reject(new Error("Request timeout"));
    }, requestConfig.timeout);
  });

  // 主请求
  const fetchPromise = fetch(fullUrl, requestConfig).then(async (response) => {
    if (!response.ok) {
      const error = new Error(response.statusText);
      error.response = response;
      throw error;
    }
    return response.json();
  });

  // 使用Promise.race实现超时控制
  return Promise.race([fetchPromise, timeoutPromise]).catch((error) => {
    // 这里可以替换为你的消息提示组件
    // message.error(error.message || "请求失败");
    throw error; // 继续抛出错误以便外部捕获
  });
};

// 使用示例：
// HttpRequest({
//   url: '/user',
//   method: 'GET',
//   params: { id: 123 }
// }).then(data => {
//   console.log(data);
// }).catch(err => {
//   console.error(err);
// });

export default HttpRequest;
